﻿namespace lowpolyconv
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("lowpoly convert!");
            //使用Assimp 读取原始模型
            Assimp.AssimpContext c = new Assimp.AssimpContext();
            var scene = c.ImportFile(args[0]);
           
            int bi = 0;

            //OBJMesh 是一个干净的描述模型的数据结构，他不依赖任何库，所以基于他写的算法是高度可移植的

            //你需要做的。
            //1.读取，assimp如果能满足你的需求，就啥也不用做。
                //否则你自己写一个你的模型到objmesh的转换程序

            //2.保存，objmesh 只提供了保存为obj 格式的方法
                //如果不满足你的需求，你自己写保存就行了

            //将原始模型中的所有模型，转换成ObjMesh
            //并执行一个ToFlat，变成扁平的，然后保存。
            foreach (var item in scene.Meshes)
            {
                bi++;
                var name = item.Name;
                if (name == "")
                {
                    name = "noname_" + bi;
                }
                var objname = name + ".obj";
                var flatname = name + "_flat.obj";

                //将assimp 模型转换为OBJMesh的方法
                var obj = assimp_toobjmesh.ToObjMesh(item);

                //ObjMesh转换lowpoly的方法（其实只是flat渲染）
                var objflat = ObjMesh.Flat(obj);


                {
                    //保存
                    var objstr = obj.SaveToObjString();
                    var tanstr = obj.SaveTangentsToString();//保存切线
                    var bonestr = obj.SaveBoneInfosToString();

                    if (objstr != null)
                    {
                        System.IO.File.Delete(objname);
                        File.WriteAllText(objname, objstr);//保存obj文件
                    }
                    if (tanstr != null)
                    {
                        System.IO.File.Delete(objname + "_tan.txt");
                        File.WriteAllText(objname + "_tan.txt", tanstr);//保存切线文件
                    }
                    if (bonestr != null)
                    {
                        System.IO.File.Delete(objname + "_bone.txt");
                        File.WriteAllText(objname + "_bone.txt", bonestr);//保存骨骼信息
                    }
                    Console.WriteLine("write obj at:" + objname);
                }
                {

                    var objstr = objflat.SaveToObjString();
                    var tanstr = objflat.SaveTangentsToString();//保存切线
                    var bonestr = objflat.SaveBoneInfosToString();

                    if (objstr != null)
                    {
                        System.IO.File.Delete(flatname);
                        File.WriteAllText(flatname, objstr);//保存obj文件
                    }
                    if (tanstr != null)
                    {
                        System.IO.File.Delete(flatname + "_tan.txt");
                        File.WriteAllText(flatname + "_tan.txt", tanstr);//保存切线文件
                    }
                    if (bonestr != null)
                    {
                        System.IO.File.Delete(flatname + "_bone.txt");
                        File.WriteAllText(flatname + "_bone.txt", bonestr);//保存骨骼信息
                    }
                    Console.WriteLine("write obj (lowpoly) at:" + flatname);
                }
            }

        }

    }
}